# Luhn算法（又称为模10算法）是一种校验和算法，广泛用于验证各种标识号码的有效性，例如信用卡号码、加拿大社会保险号码等
# 算法原理：
# 1. 从右向左，将偶数位数字乘以2，如果乘积大于9，则将十位数和个位数相加
# 2. 将所有奇数位数字和第一步得到的结果相加
# 3. 如果总和能被10整除，则号码有效

def verify_card_number(card_number):
    # 计算奇数位数字之和
    sum_of_odd_digits = 0
    # 反转卡号以便从右向左处理
    card_number_reversed = card_number[::-1]
    # 获取奇数位数字
    odd_digits = card_number_reversed[::2]

    for digit in odd_digits:
        sum_of_odd_digits += int(digit)

    # 计算偶数位数字处理后的和
    sum_of_even_digits = 0
    # 获取偶数位数字
    even_digits = card_number_reversed[1::2]
    for digit in even_digits:
        # 将偶数位数字乘以2
        number = int(digit) * 2
        # 如果乘积大于等于10，则将十位数和个位数相加
        if number >= 10:
            number = (number // 10) + (number % 10)
        sum_of_even_digits += number
    # 计算总和
    total = sum_of_odd_digits + sum_of_even_digits
    # 检查总和是否能被10整除
    return total % 10 == 0

def main():
    # 示例卡号（使用连字符分隔便于阅读）
    card_number = '4111-1111-4555-1142'
    # 创建转换表，去除连字符和空格
    card_translation = str.maketrans({'-': '', ' ': ''})
    # 应用转换表处理卡号
    translated_card_number = card_number.translate(card_translation)

    # 验证卡号并输出结果
    if verify_card_number(translated_card_number):
        print('VALID!')
    else:
        print('INVALID!')

main()